home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TeX 1995 July
/
TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO
/
dviware
/
dvidoc
/
dvidoc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-24
|
42KB
|
1,828 lines
/*
** The TeX text files device driver DVIDOC.WEB was originally written
** at OSU in April, 1983, by modifying the utility DVItype.
** Ken Yap (ken@cs.rochester.edu) modified it to work under 4.3 BSD.
** In January 1988 Neta Amit (amit@umn-cs.cs.umn.edu) tangle'd version-2
** (of July 1987). A little Icon program helped modify the resulting
** dvidoc.p into something acceptable to p2c, a Pascal-to-C transformer.
** Dvidoc.c contained 3 errors that were fixed manually.
**
** Although the program was not tested extensively, theoretically it
** should behave just like the original dvidoc.
*/
extern void exit();
/*
** Definitions for i/o
*/
# include <stdio.h>
typedef struct {
FILE *fp;
unsigned short eoln:1,
eof:1,
out:1,
init:1,
:12;
char buf;
} text;
text input = { stdin, 0, 0 };
text output = { stdout, 0, 0 };
# define Fread(x, f) fread((char *)&x, sizeof(x), 1, f)
# define Get(f) Fread((f).buf, (f).fp)
# define Getx(f) (f).init = 1, (f).eoln = (((f).buf = fgetc((f).fp)) == '\n') ? (((f).buf = ' '), 1) : 0
# define Getchr(f) (f).buf, Getx(f)
static FILE *Tmpfil;
static long Tmplng;
static double Tmpdbl;
# define Fscan(f) (f).init ? ungetc((f).buf, (f).fp) : 0, Tmpfil = (f).fp
# define Scan(p, a) Scanck(fscanf(Tmpfil, p, a))
void Scanck();
# define Fwrite(x, f) fwrite((char *)&x, sizeof(x), 1, f)
# define Put(f) Fwrite((f).buf, (f).fp)
# define Putx(f) (f).eoln = ((f).buf == '\n'), (void)fputc((f).buf, (f).fp)
# define Putchr(c, f) (f).buf = (c), Putx(f)
# define Putl(f, v) (f).eoln = v
# define Finish(f) ((f).out && !(f).eoln) ? (Putchr('\n', f), 0) : 0, rewind((f).fp), 0
# ifdef READONLY
static char Rmode[] = "r";
# else
static char Rmode[] = "r+";
# endif
# define Reset(f, n) (f).init = (f).init ? (rewind((f).fp),0) : (((f).fp = Fopen(n, Rmode)), 1), (f).eof = (f).out = 0, Get(f)
# define Resetx(f, n) (f).init = (f).init ? (Finish(f)) : (((f).fp = Fopen(n, Rmode)), 1), (f).eof = (f).out = 0, Getx(f)
# ifdef WRITEONLY
static char Wmode[] = "w";
# else
static char Wmode[] = "w+";
# endif
# define Rewrite(f, n) (f).init = (f).init ? rewind((f).fp) : (((f).fp = Fopen(n, Wmode)), 1), (f).out = (f).eof = 1
# define Rewritex(f, n) (f).init = (f).init ? (Finish(f)) : (((f).fp = Fopen(n, Wmode)), 1), (f).out = (f).eof = (f).eoln = 1
FILE *Fopen();
# define MAXFILENAME 256
/*
** Definitions for case-statements
** and for non-local gotos
*/
# define Line __LINE__
void Caseerror();
# include <setjmp.h>
static struct Jb { jmp_buf jb; } J[1];
/*
** Definitions for standard types
*/
typedef char boolean;
# define false (boolean)0
# define true (boolean)1
extern char *Bools[];
typedef int integer;
typedef double real;
extern double fabs();
extern char *strncpy();
/*
** Definitions for argv-operations
*/
int argc;
char **argv;
void
Argvgt(n, cp, l)
int n;
register int l;
register char *cp;
{
register char *sp;
for (sp = argv[n]; l > 0 && *sp; l--)
*cp++ = *sp++;
while (l-- > 0)
*cp++ = ' ';
}
/*
** Start of program definitions
*/
# define maxfonts 100
# define maxwidths 10000
# define terminallinelength 150
# define stacksize 100
# define namesize 1000
# define namelength 100
# define pagewidthmax 132
# define pagelengthmax 88
typedef unsigned char asciicode;
typedef struct {
FILE *fp;
unsigned short eoln:1,
eof:1,
out:1,
init:1,
:12;
char buf;
} textfile;
typedef integer eightbits;
typedef struct {
FILE *fp;
unsigned short eoln:1,
eof:1,
out:1,
init:1,
:12;
char buf;
} bytefile;
typedef struct { asciicode A[128]; } T59;
typedef struct { char A[255 + 1]; } T60;
typedef struct { char A[namelength - 1 + 1]; } T61;
typedef struct { integer A[maxfonts + 1]; } T62;
typedef struct { unsigned short A[maxfonts + 1]; } T63;
typedef struct { asciicode A[namesize + 1]; } T64;
typedef struct { integer A[maxfonts + 1]; } T65;
typedef struct { integer A[maxfonts + 1]; } T66;
typedef struct { integer A[maxfonts + 1]; } T67;
typedef struct { integer A[maxfonts + 1]; } T68;
typedef struct { integer A[maxfonts + 1]; } T69;
typedef struct { integer A[maxfonts + 1]; } T70;
typedef struct { integer A[maxfonts + 1]; } T71;
typedef struct { integer A[maxwidths + 1]; } T72;
typedef struct { integer A[255 + 1]; } T73;
typedef struct { integer A[maxwidths + 1]; } T74;
typedef struct { integer A[9 + 1]; } T75;
typedef struct { boolean A[9 + 1]; } T76;
typedef struct { integer A[9 + 1]; } T77;
typedef struct { asciicode A[terminallinelength + 1]; } T78;
typedef struct { char A[9 - 1 + 1]; } T79;
typedef struct { struct { asciicode A[pagelengthmax - 1 + 1]; } A[pagewidthmax - 1 + 1]; } T80;
typedef struct { unsigned char A[pagelengthmax - 1 + 1]; } T81;
typedef struct { integer A[stacksize + 1]; } T82;
typedef struct { integer A[stacksize + 1]; } T83;
T59 xord;
T60 xchr;
bytefile dvifile;
boolean eofdvifile;
bytefile tfmfile;
integer curloc;
T61 basename, curname, realnameoffile;
eightbits b0, b1, b2, b3;
T62 fontnum;
T63 fontname;
T64 names;
T65 fontchecksum;
T66 fontscaledsize;
T67 fontdesignsize;
T68 fontspace;
T69 fontbc;
T70 fontec;
T71 widthbase;
T72 width;
unsigned char nf;
unsigned short widthptr;
T73 inwidth;
integer tfmchecksum;
T74 pixelwidth;
real horizconv;
real vertconv;
real truehorizconv;
real truevertconv;
integer numerator, denominator;
integer mag;
integer maxpages;
real horizresolution;
real vertresolution;
integer newmag;
T75 startcount;
T76 startthere;
unsigned char startvals;
T77 count;
T78 buffer;
unsigned char bufptr;
boolean inpostamble;
T79 defaultdirectory;
unsigned char i;
boolean logerrors;
textfile errfile;
T80 pagebuffer;
T81 linehwm;
unsigned char pagehwm;
integer h, v, w, x, y, z,
hh, vv;
T82 hstack, vstack, wstack, xstack, ystack, zstack;
T83 hhstack, vvstack;
integer maxv;
integer maxh;
integer maxs;
integer maxvsofar, maxhsofar, maxssofar;
integer totalpages;
integer pagecount;
integer s;
integer ss;
integer curfont;
integer oldbackpointer;
integer newbackpointer;
boolean started;
integer postloc;
integer firstbackpointer;
integer startloc;
integer k, m, n, p, q;
extern void opendvifile();
extern integer getbyte();
extern integer signedbyte();
extern integer gettwobytes();
extern integer signedpair();
extern integer getthreebytes();
extern integer signedtrio();
extern integer signedquad();
extern integer curpos();
extern void setpos();
extern void setpaths();
extern boolean testaccess();
extern void exit();
void
initialize()
{
register integer i;
setpaths();
{
integer B1 = 0,
B2 = 31;
if (B1 <= B2)
for (i = B1; ; i++) {
xchr.A[i] = '?';
if (i == B2) break;
}
}
xchr.A[32] = ' ';
xchr.A[33] = '!';
xchr.A[34] = '"';
xchr.A[35] = '#';
xchr.A[36] = '$';
xchr.A[37] = '%';
xchr.A[38] = '&';
xchr.A[39] = '\'';
xchr.A[40] = '(';
xchr.A[41] = ')';
xchr.A[42] = '*';
xchr.A[43] = '+';
xchr.A[44] = ',';
xchr.A[45] = '-';
xchr.A[46] = '.';
xchr.A[47] = '/';
xchr.A[48] = '0';
xchr.A[49] = '1';
xchr.A[50] = '2';
xchr.A[51] = '3';
xchr.A[52] = '4';
xchr.A[53] = '5';
xchr.A[54] = '6';
xchr.A[55] = '7';
xchr.A[56] = '8';
xchr.A[57] = '9';
xchr.A[58] = ':';
xchr.A[59] = ';';
xchr.A[60] = '<';
xchr.A[61] = '=';
xchr.A[62] = '>';
xchr.A[63] = '?';
xchr.A[64] = '@';
xchr.A[65] = 'A';
xchr.A[66] = 'B';
xchr.A[67] = 'C';
xchr.A[68] = 'D';
xchr.A[69] = 'E';
xchr.A[70] = 'F';
xchr.A[71] = 'G';
xchr.A[72] = 'H';
xchr.A[73] = 'I';
xchr.A[74] = 'J';
xchr.A[75] = 'K';
xchr.A[76] = 'L';
xchr.A[77] = 'M';
xchr.A[78] = 'N';
xchr.A[79] = 'O';
xchr.A[80] = 'P';
xchr.A[81] = 'Q';
xchr.A[82] = 'R';
xchr.A[83] = 'S';
xchr.A[84] = 'T';
xchr.A[85] = 'U';
xchr.A[86] = 'V';
xchr.A[87] = 'W';
xchr.A[88] = 'X';
xchr.A[89] = 'Y';
xchr.A[90] = 'Z';
xchr.A[91] = '[';
xchr.A[92] = '\\';
xchr.A[93] = ']';
xchr.A[94] = '^';
xchr.A[95] = '_';
xchr.A[96] = '`';
xchr.A[97] = 'a';
xchr.A[98] = 'b';
xchr.A[99] = 'c';
xchr.A[100] = 'd';
xchr.A[101] = 'e';
xchr.A[102] = 'f';
xchr.A[103] = 'g';
xchr.A[104] = 'h';
xchr.A[105] = 'i';
xchr.A[106] = 'j';
xchr.A[107] = 'k';
xchr.A[108] = 'l';
xchr.A[109] = 'm';
xchr.A[110] = 'n';
xchr.A[111] = 'o';
xchr.A[112] = 'p';
xchr.A[113] = 'q';
xchr.A[114] = 'r';
xchr.A[115] = 's';
xchr.A[116] = 't';
xchr.A[117] = 'u';
xchr.A[118] = 'v';
xchr.A[119] = 'w';
xchr.A[120] = 'x';
xchr.A[121] = 'y';
xchr.A[122] = 'z';
xchr.A[123] = '{';
xchr.A[124] = '|';
xchr.A[125] = '}';
xchr.A[126] = '~';
{
integer B3 = 127,
B4 = 255;
if (B3 <= B4)
for (i = B3; ; i++) {
xchr.A[i] = '?';
if (i == B4) break;
}
}
{
integer B5 = 0,
B6 = 127;
if (B5 <= B6)
for (i = B5; ; i++) {
xord.A[i] = 32;
if (i == B6) break;
}
}
{
integer B7 = 32,
B8 = 126;
if (B7 <= B8)
for (i = B7; ; i++) {
xord.A[xchr.A[i]] = i;
if (i == B8) break;
}
}
nf = 0;
widthptr = 0;
fontname.A[0] = 0;
fontspace.A[0] = 0;
maxpages = 1000000;
startvals = 0;
startthere.A[0] = false;
inpostamble = false;
(void)strncpy(defaultdirectory.A, "TeXfonts:", sizeof(defaultdirectory.A));
maxv = 2147483548;
maxh = 2147483548;
maxs = stacksize + 1;
maxvsofar = 0;
maxhsofar = 0;
maxssofar = 0;
pagecount = 0;
oldbackpointer = -1;
started = false;
}
void
jumpout()
{
longjmp(J[0].jb, 9999);
}
void
opentfmfile()
{
if (testaccess(4, 3))
Resetx(tfmfile, realnameoffile.A);
else {
(void)fprintf(errfile.fp, "TFM file not found\n"), Putl(errfile, 1);
longjmp(J[0].jb, 30);
}
}
void
readtfmword()
{
char byte;
byte = Getchr(tfmfile);
b0 = (unsigned)(byte);
if (b0 < 0)
b0 = b0 + 256;
byte = Getchr(tfmfile);
b1 = (unsigned)(byte);
if (b1 < 0)
b1 = b1 + 256;
byte = Getchr(tfmfile);
b2 = (unsigned)(byte);
if (b2 < 0)
b2 = b2 + 256;
byte = Getchr(tfmfile);
b3 = (unsigned)(byte);
if (b3 < 0)
b3 = b3 + 256;
}
integer
dvilength()
{
register integer R93;
setpos(&dvifile, -1);
R93 = curpos(&dvifile);
return R93;
}
void
movetobyte(n)
integer n;
{
setpos(&dvifile, n);
curloc = n;
}
void
printfont(f)
integer f;
{
register unsigned short k;
if (f == nf)
(void)fprintf(errfile.fp, "UNDEFINED!"), Putl(errfile, 0);
else {
{
unsigned short B9 = fontname.A[f],
B10 = fontname.A[f + 1] - 1;
if (B9 <= B10)
for (k = B9; ; k++) {
Putchr(xchr.A[names.A[k]], errfile);
if (k == B10) break;
}
}
}
}
boolean
intfm(z)
integer z;
{
register boolean R94;
register integer k;
integer lh;
integer nw;
unsigned short wp;
integer alpha, beta;
readtfmword();
lh = b2 * 256 + b3;
readtfmword();
fontbc.A[nf] = b0 * 256 + b1;
fontec.A[nf] = b2 * 256 + b3;
if (fontec.A[nf] < fontbc.A[nf])
fontbc.A[nf] = fontec.A[nf] + 1;
if (widthptr + fontec.A[nf] - fontbc.A[nf] + 1 > maxwidths) {
(void)fprintf(errfile.fp, "---not loaded, DVIDOC needs larger width table\n"), Putl(errfile, 1);
goto L9998;
}
wp = widthptr + fontec.A[nf] - fontbc.A[nf] + 1;
readtfmword();
nw = b0 * 256 + b1;
if ((nw == 0) || (nw > 256))
goto L9997;
{
integer B11 = 1,
B12 = 3 + lh;
if (B11 <= B12)
for (k = B11; ; k++) {
if (eofdvifile)
goto L9997;
readtfmword();
if (k == 4)
if (b0 < 128)
tfmchecksum = ((b0 * 256 + b1) * 256 + b2) * 256 + b3;
else
tfmchecksum = (((b0 - 256) * 256 + b1) * 256 + b2) * 256 + b3;
if (k == B12) break;
}
}
if (wp > 0)
{
integer B13 = widthptr,
B14 = wp - 1;
if (B13 <= B14)
for (k = B13; ; k++) {
readtfmword();
if (b0 > nw)
goto L9997;
width.A[k] = b0;
if (k == B14) break;
}
}
{
alpha = 16 * z;
beta = 16;
while (z >= 8388608) {
z = z / 2;
beta = beta / 2;
}
}
{
integer B15 = 0,
B16 = nw - 1;
if (B15 <= B16)
for (k = B15; ; k++) {
readtfmword();
inwidth.A[k] = (((((b3 * z) / 256) + (b2 * z)) / 256) + (b1 * z)) / beta;
if (b0 > 0)
if (b0 < 255)
goto L9997;
else
inwidth.A[k] = inwidth.A[k] - alpha;
if (k == B16) break;
}
}
widthbase.A[nf] = widthptr - fontbc.A[nf];
if (wp > 0)
{
integer B17 = widthptr,
B18 = wp - 1;
if (B17 <= B18)
for (k = B17; ; k++) {
width.A[k] = inwidth.A[width.A[k]];
pixelwidth.A[k] = Round(horizconv * (width.A[k]));
if (k == B18) break;
}
}
widthptr = wp;
R94 = true;
goto L9999;
L9997:
(void)fprintf(errfile.fp, "---not loaded, TFM file is bad\n"), Putl(errfile, 1);
L9998:
R94 = false;
L9999:
;
return R94;
}
boolean
startmatch()
{
register boolean R95;
register unsigned char k;
boolean match;
match = true;
{
unsigned char B19 = 0,
B20 = startvals;
if (B19 <= B20)
for (k = B19; ; k++) {
if (startthere.A[k] && (startcount.A[k] != count.A[k]))
match = false;
if (k == B20) break;
}
}
R95 = match;
return R95;
}
void
copyln()
{
unsigned char k;
k = 2;
while ((k < namelength) && (curname.A[k - 1] != ' ')) {
buffer.A[k - 3] = xord.A[curname.A[k - 1]];
k = k + 1;
}
buffer.A[k - 3] = xord.A[' '];
}
integer
getinteger()
{
register integer R96;
integer x;
boolean negative;
if (buffer.A[bufptr] == 45) {
negative = true;
bufptr = bufptr + 1;
} else
negative = false;
x = 0;
while ((buffer.A[bufptr] >= 48) && (buffer.A[bufptr] <= 57)) {
x = 10 * x + buffer.A[bufptr] - 48;
bufptr = bufptr + 1;
}
if (negative)
R96 = -x;
else
R96 = x;
return R96;
}
void
options()
{
integer j, k;
logerrors = false;
startvals = 0;
startthere.A[0] = false;
maxpages = 1000000;
horizresolution = 13.76582;
vertresolution = 6.0225;
newmag = 0;
basename.A[1 - 1] = ' ';
j = 1;
while (j < argc) {
Argvgt(j, curname.A, sizeof(curname.A));
if (curname.A[1 - 1] == '-') {
if (curname.A[2 - 1] == 'e')
logerrors = true;
else
if (curname.A[2 - 1] == 's') {
copyln();
bufptr = 0;
k = 0;
if (buffer.A[0] != 32)
do {
if (buffer.A[bufptr] == 42) {
startthere.A[k] = false;
bufptr = bufptr + 1;
} else {
startthere.A[k] = true;
startcount.A[k] = getinteger();
}
if ((k < 9) && (buffer.A[bufptr] == 46)) {
k = k + 1;
bufptr = bufptr + 1;
} else
if (buffer.A[bufptr] == 32)
startvals = k;
else {
(void)fprintf(stderr, "1.*.-5 specifies first page with \\count0=1, \\count2=-5.\n"), Putl(output, 1);
longjmp(J[0].jb, 30);
}
} while (!(startvals == k));
} else
if (curname.A[2 - 1] == 'm') {
copyln();
bufptr = 0;
if (buffer.A[0] != 32) {
maxpages = getinteger();
if (maxpages <= 0) {
(void)fprintf(stderr, "Maxpages should be a positive number.\n"), Putl(output, 1);
longjmp(J[0].jb, 30);
}
}
} else {
(void)fprintf(stderr, "Usage: dvidoc [-e] [-s<start page spec>] [-m<maxpages>] <dvi-file>\n"), Putl(output, 1);
longjmp(J[0].jb, 30);
}
} else
if (basename.A[1 - 1] == ' ')
Argvgt(j, basename.A, sizeof(basename.A));
else {
(void)fprintf(stderr, "Only one input file please\n"), Putl(output, 1);
longjmp(J[0].jb, 30);
}
j = j + 1;
}
if (basename.A[1 - 1] == ' ') {
(void)fprintf(stderr, "No input file specified\n"), Putl(output, 1);
longjmp(J[0].jb, 30);
}
}
void
definefont(e)
integer e;
{
unsigned char f;
integer p;
integer n;
integer c, q, d;
unsigned char r;
unsigned short j;
register unsigned short k;
boolean mismatch;
if (nf == maxfonts) {
(void)fprintf(stderr, " DVIDOC capacity exceeded (max fonts=%1d)!\n", maxfonts), Putl(output, 1);
jumpout();
}
fontnum.A[nf] = e;
f = 0;
while (fontnum.A[f] != e)
f = f + 1;
c = signedquad();
fontchecksum.A[nf] = c;
q = signedquad();
fontscaledsize.A[nf] = q;
d = signedquad();
fontdesignsize.A[nf] = d;
p = getbyte();
n = getbyte();
if (fontname.A[nf] + n + p > namesize) {
(void)fprintf(stderr, " DVIDOC capacity exceeded (name size=%1d)!\n", namesize), Putl(output, 1);
jumpout();
}
fontname.A[nf + 1] = fontname.A[nf] + n + p;
(void)fprintf(errfile.fp, "Font %1d: ", e), Putl(errfile, 0);
if (n + p == 0)
(void)fprintf(errfile.fp, "null font name!"), Putl(errfile, 0);
else
{
unsigned short B21 = fontname.A[nf],
B22 = fontname.A[nf + 1] - 1;
if (B21 <= B22)
for (k = B21; ; k++) {
names.A[k] = getbyte();
if (k == B22) break;
}
}
nf = nf + 1;
printfont(nf - 1);
nf = nf - 1;
if (inpostamble) {
if (f < nf)
(void)fprintf(errfile.fp, "---this font was already defined!\n"), Putl(errfile, 1);
} else {
if (f == nf)
(void)fprintf(errfile.fp, "---this font wasn't loaded before!\n"), Putl(errfile, 1);
}
if (f == nf) {
{
unsigned short B23 = 1,
B24 = namelength;
if (B23 <= B24)
for (k = B23; ; k++) {
curname.A[k - 1] = ' ';
if (k == B24) break;
}
}
r = 0;
{
unsigned short B25 = fontname.A[nf],
B26 = fontname.A[nf + 1] - 1;
if (B25 <= B26)
for (k = B25; ; k++) {
r = r + 1;
if (r + 4 > namelength) {
(void)fprintf(stderr, " DVIDOC capacity exceeded (max font name length=%1d)!\n", namelength), Putl(output, 1);
jumpout();
}
curname.A[r - 1] = xchr.A[names.A[k]];
if (k == B26) break;
}
}
curname.A[r + 1 - 1] = '.';
curname.A[r + 2 - 1] = 't';
curname.A[r + 3 - 1] = 'f';
curname.A[r + 4 - 1] = 'm';
opentfmfile();
if (eofdvifile)
(void)fprintf(errfile.fp, "---not loaded, TFM file can't be opened!"), Putl(errfile, 0);
else {
if ((q <= 0) || (q >= 134217728))
(void)fprintf(errfile.fp, "---not loaded, bad scale (%1d)!", q), Putl(errfile, 0);
else
if ((d <= 0) || (d >= 134217728))
(void)fprintf(errfile.fp, "---not loaded, bad design size (%1d)!", d), Putl(errfile, 0);
else
if (intfm(q)) {
fontspace.A[nf] = q / 6;
if ((c != 0) && (tfmchecksum != 0) && (c != tfmchecksum)) {
(void)fprintf(errfile.fp, "---beware: check sums do not agree!\n"), Putl(errfile, 1);
(void)fprintf(errfile.fp, " (%1d vs. %1d)\n", c, tfmchecksum), Putl(errfile, 1);
(void)fprintf(errfile.fp, " "), Putl(errfile, 0);
}
(void)fprintf(errfile.fp, "---loaded at size %1d DVI units", q), Putl(errfile, 0);
d = Round((100.0 * horizconv * q) / ((real)(truehorizconv * d)));
if (d != 100) {
Putchr(' ', errfile),Putchr('\n', errfile);
(void)fprintf(errfile.fp, " (this font is magnified %1d%%)", d), Putl(errfile, 0);
}
nf = nf + 1;
fontspace.A[nf] = 0;
}
}
Putchr(' ', errfile),Putchr('\n', errfile);
} else {
if (fontchecksum.A[f] != c)
(void)fprintf(errfile.fp, "---check sum doesn't match previous definition!\n"), Putl(errfile, 1);
if (fontscaledsize.A[f] != q)
(void)fprintf(errfile.fp, "---scaled size doesn't match previous definition!\n"), Putl(errfile, 1);
if (fontdesignsize.A[f] != d)
(void)fprintf(errfile.fp, "---design size doesn't match previous definition!\n"), Putl(errfile, 1);
j = fontname.A[f];
k = fontname.A[nf];
mismatch = false;
while (j < fontname.A[f + 1]) {
if (names.A[j] != names.A[k])
mismatch = true;
j = j + 1;
k = k + 1;
}
if (k != fontname.A[nf + 1])
mismatch = true;
if (mismatch)
(void)fprintf(errfile.fp, "---font name doesn't match previous definition!\n"), Putl(errfile, 1);
Putchr(' ', errfile),Putchr('\n', errfile);
}
}
void
flushpage()
{
register unsigned char i;
register unsigned char j;
{
unsigned char B27 = 1,
B28 = pagehwm;
if (B27 <= B28)
for (j = B27; ; j++) {
{
unsigned char B29 = 1,
B30 = linehwm.A[j - 1];
if (B29 <= B30)
for (i = B29; ; i++) {
Putchr(xchr.A[pagebuffer.A[i - 1].A[j - 1]], output);
if (i == B30) break;
}
}
Putchr('\n', output);
if (j == B28) break;
}
}
Putchr(12, output);
}
void
emptypage()
{
pagehwm = 0;
}
void
outchar(p, hh, vv)
integer p, hh, vv;
{
unsigned char i;
unsigned char j;
register integer k;
asciicode c;
if ((p > 32) && (p <= 126))
c = p;
else
c = xord.A['?'];
if ((hh > pagewidthmax - 1) || (vv > pagelengthmax - 1) ||
(hh < 0) || (vv < 0)) {
Putchr(' ', errfile),Putchr('\n', errfile);
(void)fprintf(errfile.fp, "Character \"%c\" set at column %1d", xchr.A[c], hh + 1), Putl(errfile, 0);
(void)fprintf(errfile.fp, " and row %1d,\n", vv + 1), Putl(errfile, 1);
(void)fprintf(errfile.fp, "outside the range of DVIDOC ("), Putl(errfile, 0);
(void)fprintf(errfile.fp, "%1d,%1d).", pagewidthmax, pagelengthmax), Putl(errfile, 0);
Putchr(' ', errfile),Putchr('\n', errfile);
} else {
i = hh + 1;
j = vv + 1;
if (j > pagehwm) {
{
integer B31 = pagehwm + 1,
B32 = j;
if (B31 <= B32)
for (k = B31; ; k++) {
linehwm.A[k - 1] = 0;
if (k == B32) break;
}
}
pagehwm = j;
}
if (i > linehwm.A[j - 1]) {
{
integer B33 = linehwm.A[j - 1] + 1,
B34 = i;
if (B33 <= B34)
for (k = B33; ; k++) {
pagebuffer.A[k - 1].A[j - 1] = xord.A[' '];
if (k == B34) break;
}
}
linehwm.A[j - 1] = i;
}
pagebuffer.A[i - 1].A[j - 1] = c;
}
}
integer
firstpar(o)
eightbits o;
{
register integer R97;
switch (o) {
case 0: case 1: case 2: case 3:
case 4: case 5: case 6: case 7:
case 8: case 9: case 10: case 11:
case 12: case 13: case 14: case 15:
case 16: case 17: case 18: case 19:
case 20: case 21: case 22: case 23:
case 24: case 25: case 26: case 27:
case 28: case 29: case 30: case 31:
case 32: case 33: case 34: case 35:
case 36: case 37: case 38: case 39:
case 40: case 41: case 42: case 43:
case 44: case 45: case 46: case 47:
case 48: case 49: case 50: case 51:
case 52: case 53: case 54: case 55:
case 56: case 57: case 58: case 59:
case 60: case 61: case 62: case 63:
case 64: case 65: case 66: case 67:
case 68: case 69: case 70: case 71:
case 72: case 73: case 74: case 75:
case 76: case 77: case 78: case 79:
case 80: case 81: case 82: case 83:
case 84: case 85: case 86: case 87:
case 88: case 89: case 90: case 91:
case 92: case 93: case 94: case 95:
case 96: case 97: case 98: case 99:
case 100: case 101: case 102: case 103:
case 104: case 105: case 106: case 107:
case 108: case 109: case 110: case 111:
case 112: case 113: case 114: case 115:
case 116: case 117: case 118: case 119:
case 120: case 121: case 122: case 123:
case 124: case 125: case 126: case 127:
R97 = o - 0;
break ;
case 128: case 133: case 235: case 239:
case 243:
R97 = getbyte();
break ;
case 129: case 134: case 236: case 240:
case 244:
R97 = gettwobytes();
break ;
case 130: case 135: case 237: case 241:
case 245:
R97 = getthreebytes();
break ;
case 143: case 148: case 153: case 157:
case 162: case 167:
R97 = signedbyte();
break ;
case 144: case 149: case 154: case 158:
case 163: case 168:
R97 = signedpair();
break ;
case 145: case 150: case 155: case 159:
case 164: case 169:
R97 = signedtrio();
break ;
case 131: case 132: case 136: case 137:
case 146: case 151: case 156: case 160:
case 165: case 170: case 238: case 242:
case 246:
R97 = signedquad();
break ;
case 138: case 139: case 140: case 141:
case 142: case 247: case 248: case 249:
case 250: case 251: case 252: case 253:
case 254: case 255:
R97 = 0;
break ;
case 147:
R97 = w;
break ;
case 152:
R97 = x;
break ;
case 161:
R97 = y;
break ;
case 166:
R97 = z;
break ;
case 171: case 172: case 173: case 174:
case 175: case 176: case 177: case 178:
case 179: case 180: case 181: case 182:
case 183: case 184: case 185: case 186:
case 187: case 188: case 189: case 190:
case 191: case 192: case 193: case 194:
case 195: case 196: case 197: case 198:
case 199: case 200: case 201: case 202:
case 203: case 204: case 205: case 206:
case 207: case 208: case 209: case 210:
case 211: case 212: case 213: case 214:
case 215: case 216: case 217: case 218:
case 219: case 220: case 221: case 222:
case 223: case 224: case 225: case 226:
case 227: case 228: case 229: case 230:
case 231: case 232: case 233: case 234:
R97 = o - 171;
break ;
default:
Caseerror(Line);
}
return R97;
}
integer
horizrulepixels(x)
integer x;
{
register integer R98;
integer n;
n = Trunc(horizconv * x);
if (n < horizconv * x)
R98 = n + 1;
else
R98 = n;
return R98;
}
integer
vertrulepixels(x)
integer x;
{
register integer R99;
integer n;
n = Trunc(vertconv * x);
if (n < vertconv * x)
R99 = n + 1;
else
R99 = n;
return R99;
}
boolean
specialcases(o, p, a)
eightbits o;
integer p, a;
{
register boolean R100;
integer q;
register integer k;
boolean badchar;
boolean pure;
integer vvv;
pure = true;
switch (o) {
case 133: case 134: case 135: case 136:
goto L30;
break ;
case 157: case 158: case 159: case 160:
if (abs(p) >= 5 * fontspace.A[curfont])
vv = Round(vertconv * (v + p));
else
vv = vv + Round(vertconv * (p));
goto L44;
break ;
case 161: case 162: case 163: case 164:
case 165:
y = p;
if (abs(p) >= 5 * fontspace.A[curfont])
vv = Round(vertconv * (v + p));
else
vv = vv + Round(vertconv * (p));
goto L44;
break ;
case 166: case 167: case 168: case 169:
case 170:
z = p;
if (abs(p) >= 5 * fontspace.A[curfont])
vv = Round(vertconv * (v + p));
else
vv = vv + Round(vertconv * (p));
goto L44;
break ;
case 171: case 172: case 173: case 174:
case 175: case 176: case 177: case 178:
case 179: case 180: case 181: case 182:
case 183: case 184: case 185: case 186:
case 187: case 188: case 189: case 190:
case 191: case 192: case 193: case 194:
case 195: case 196: case 197: case 198:
case 199: case 200: case 201: case 202:
case 203: case 204: case 205: case 206:
case 207: case 208: case 209: case 210:
case 211: case 212: case 213: case 214:
case 215: case 216: case 217: case 218:
case 219: case 220: case 221: case 222:
case 223: case 224: case 225: case 226:
case 227: case 228: case 229: case 230:
case 231: case 232: case 233: case 234:
goto L46;
break ;
case 235: case 236: case 237: case 238:
goto L46;
break ;
case 243: case 244: case 245: case 246:
definefont(p);
goto L30;
break ;
case 239: case 240: case 241: case 242:
(void)fprintf(errfile.fp, "xxx'"), Putl(errfile, 0);
badchar = false;
{
integer B35 = 1,
B36 = p;
if (B35 <= B36)
for (k = B35; ; k++) {
q = getbyte();
if ((q < 32) || (q > 126))
badchar = true;
Putchr(xchr.A[q], errfile);
if (k == B36) break;
}
}
Putchr('\'', errfile);
if (badchar)
(void)fprintf(errfile.fp, "non-ASCII character in xxx command!\n"), Putl(errfile, 1);
goto L30;
break ;
case 247:
(void)fprintf(errfile.fp, "preamble command within a page!\n"), Putl(errfile, 1);
goto L9998;
break ;
case 248: case 249:
(void)fprintf(errfile.fp, "postamble command within a page!\n"), Putl(errfile, 1);
goto L9998;
break ;
default:
{
(void)fprintf(errfile.fp, "undefined command %1d!\n", o), Putl(errfile, 1);
goto L30;
}
}
L44:
if ((v > 0) && (p > 0))
if (v > 2147483647 - p) {
(void)fprintf(errfile.fp, "arithmetic overflow! parameter changed from %1d to %1d\n", p, 2147483647 - v), Putl(errfile, 1);
p = 2147483647 - v;
}
if ((v < 0) && (p < 0))
if (-v > p + 2147483647) {
(void)fprintf(errfile.fp, "arithmetic overflow! parameter changed from %1d to %1d\n", p, (-v) - 2147483647), Putl(errfile, 1);
p = (-v) - 2147483647;
}
vvv = Round(vertconv * (v + p));
if (abs(vvv - vv) > 2)
if (vvv > vv)
vv = vvv - 2;
else
vv = vvv + 2;
v = v + p;
if (abs(v) > maxvsofar) {
if (abs(v) > maxv + 99) {
(void)fprintf(errfile.fp, "warning: |v|>%1d!\n", maxv), Putl(errfile, 1);
maxv = abs(v);
}
maxvsofar = abs(v);
}
goto L30;
L46:
fontnum.A[nf] = p;
curfont = 0;
while (fontnum.A[curfont] != p)
curfont = curfont + 1;
goto L30;
L9998:
pure = false;
L30:
R100 = pure;
return R100;
}
boolean
dopage()
{
register boolean R101;
eightbits o;
integer p, q;
integer a;
register integer j;
register integer i;
integer hhh;
emptypage();
curfont = nf;
s = 0;
h = 0;
v = 0;
w = 0;
x = 0;
y = 0;
z = 0;
hh = 0;
vv = 0;
while (true) {
a = curloc;
o = getbyte();
p = firstpar(o);
if (eofdvifile) {
(void)fprintf(stderr, " Bad DVI file: the file ended prematurely!\n"), Putl(output, 1);
jumpout();
}
if (o < 128) {
outchar(p, hh, vv);
} else
switch (o) {
case 128: case 129: case 130: case 131:
outchar(p, hh, vv);
goto L41;
break ;
case 132:
goto L42;
break ;
case 137:
goto L42;
break ;
case 138:
goto L30;
break ;
case 139:
(void)fprintf(errfile.fp, "bop occurred before eop!\n"), Putl(errfile, 1);
goto L9998;
break ;
case 140:
if (s != 0)
(void)fprintf(errfile.fp, "stack not empty at end of page (level %1d)!\n", s), Putl(errfile, 1);
R101 = true;
flushpage();
goto L9999;
break ;
case 141:
if (s == maxssofar) {
maxssofar = s + 1;
if (s == maxs)
(void)fprintf(errfile.fp, "deeper than claimed in postamble!\n"), Putl(errfile, 1);
if (s == stacksize) {
(void)fprintf(errfile.fp, "DVIDOC capacity exceeded (stack size=%1d)\n", stacksize), Putl(errfile, 1);
goto L9998;
}
}
hstack.A[s] = h;
vstack.A[s] = v;
wstack.A[s] = w;
xstack.A[s] = x;
ystack.A[s] = y;
zstack.A[s] = z;
hhstack.A[s] = hh;
vvstack.A[s] = vv;
s = s + 1;
ss = s - 1;
goto L45;
break ;
case 142:
if (s == 0)
(void)fprintf(errfile.fp, "Pop illegal at level zero!\n"), Putl(errfile, 1);
else {
s = s - 1;
hh = hhstack.A[s];
vv = vvstack.A[s];
h = hstack.A[s];
v = vstack.A[s];
w = wstack.A[s];
x = xstack.A[s];
y = ystack.A[s];
z = zstack.A[s];
}
ss = s;
goto L45;
break ;
case 143: case 144: case 145: case 146:
if (abs(p) >= fontspace.A[curfont]) {
hh = Round(horizconv * (h + p));
} else
hh = hh + Round(horizconv * (p));
q = p;
goto L43;
break ;
case 147: case 148: case 149: case 150:
case 151:
w = p;
if (abs(p) >= fontspace.A[curfont]) {
hh = Round(horizconv * (h + p));
} else
hh = hh + Round(horizconv * (p));
q = p;
goto L43;
break ;
case 152: case 153: case 154: case 155:
case 156:
x = p;
if (abs(p) >= fontspace.A[curfont]) {
hh = Round(horizconv * (h + p));
} else
hh = hh + Round(horizconv * (p));
q = p;
goto L43;
break ;
default:
if (specialcases(o, p, a))
goto L30;
else
goto L9998;
}
L41:
if (p < 0)
p = 255 - ((-1 - p) % 256);
else
if (p >= 256)
p = p % 256;
if ((p < fontbc.A[curfont]) || (p > fontec.A[curfont]))
q = 2147483647;
else
q = width.A[widthbase.A[curfont] + p];
if (q == 2147483647) {
(void)fprintf(errfile.fp, "character %1d invalid in font \n", p), Putl(errfile, 1);
printfont(curfont);
if (curfont != nf)
Putchr('!', errfile);
}
if (o >= 133)
goto L30;
if (q == 2147483647)
q = 0;
else
hh = hh + pixelwidth.A[widthbase.A[curfont] + p];
goto L43;
L42:
q = signedquad();
if ((p > 0) && (q > 0))
{
integer B37 = hh,
B38 = hh + horizrulepixels(q) - 1;
if (B37 <= B38)
for (i = B37; ; i++) {
{
integer B39 = vv,
B40 = vv - vertrulepixels(p) + 1;
if (B39 >= B40)
for (j = B39; ; j--) {
outchar(xord.A['-'], i, j);
if (j == B40) break;
}
}
if (i == B38) break;
}
}
if (o == 137)
goto L30;
hh = hh + horizrulepixels(q);
goto L43;
L43:
if ((h > 0) && (q > 0))
if (h > 2147483647 - q) {
(void)fprintf(errfile.fp, "arithmetic overflow! parameter changed from %1d to %1d\n", q, 2147483647 - h), Putl(errfile, 1);
q = 2147483647 - h;
}
if ((h < 0) && (q < 0))
if (-h > q + 2147483647) {
(void)fprintf(errfile.fp, "arithmetic overflow! parameter changed from %1d to %1d\n", q, (-h) - 2147483647), Putl(errfile, 1);
q = (-h) - 2147483647;
}
hhh = Round(horizconv * (h + q));
if (abs(hhh - hh) > 2)
if (hhh > hh)
hh = hhh - 2;
else
hh = hhh + 2;
h = h + q;
if (abs(h) > maxhsofar) {
if (abs(h) > maxh + 99) {
(void)fprintf(errfile.fp, "warning: |h|>%1d!\n", maxh), Putl(errfile, 1);
maxh = abs(h);
}
maxhsofar = abs(h);
}
goto L30;
L45:
;
L30:
;
}
L9998:
Putchr('!', errfile),Putchr('\n', errfile);
R101 = false;
L9999:
;
return R101;
}
void
readpostamble()
{
integer k;
integer p, q, m;
postloc = curloc - 5;
if (signedquad() != numerator)
(void)fprintf(errfile.fp, "numerator doesn't match the preamble!\n"), Putl(errfile, 1);
if (signedquad() != denominator)
(void)fprintf(errfile.fp, "denominator doesn't match the preamble!\n"), Putl(errfile, 1);
if (signedquad() != mag)
if (newmag == 0)
(void)fprintf(errfile.fp, "magnification doesn't match the preamble!\n"), Putl(errfile, 1);
maxv = signedquad();
maxh = signedquad();
maxs = gettwobytes();
totalpages = gettwobytes();
do {
k = getbyte();
if ((k >= 243) && (k < 247)) {
p = firstpar(k);
definefont(p);
Putchr(' ', errfile),Putchr('\n', errfile);
k = 138;
}
} while (!(k != 138));
if (k != 249)
(void)fprintf(errfile.fp, "byte %1d is not postpost!\n", curloc - 1), Putl(errfile, 1);
q = signedquad();
if (q != postloc)
(void)fprintf(errfile.fp, "bad postamble pointer in byte %1d!\n", curloc - 4), Putl(errfile, 1);
m = getbyte();
if (m != 2)
(void)fprintf(errfile.fp, "identification in byte %1d should be %1d!\n", curloc - 1, 2), Putl(errfile, 1);
k = curloc;
m = 223;
while ((m == 223) && !eofdvifile)
m = getbyte();
if (!eofdvifile) {
(void)fprintf(stderr, " Bad DVI file: signature in byte %1d should be 223!\n", curloc - 1), Putl(output, 1);
jumpout();
} else
if (curloc < k + 4)
(void)fprintf(errfile.fp, "not enough signature bytes at end of file (%1d)\n", curloc - k), Putl(errfile, 1);
}
/*
** Start of program code
*/
main(_ac, _av)
int _ac;
char *_av[];
{
argc = _ac;
argv = _av;
switch (setjmp(J[0].jb)) {
case 0:
break;
case 9999:
goto L9999;
case 30:
goto L30;
default:
Caseerror(Line);
}
initialize();
options();
i = 1;
while ((i < namelength) && (basename.A[i - 1] != ' '))
i = i + 1;
if (i < 5) {
basename.A[i - 1] = '.';
basename.A[i + 1 - 1] = 'd';
basename.A[i + 2 - 1] = 'v';
basename.A[i + 3 - 1] = 'i';
basename.A[i + 4 - 1] = ' ';
}
if ((i >= 5) && (i < namelength - 4) && ((basename.A[i - 4 - 1] != '.') || (basename.A[i - 3 - 1] != 'd') || (basename.A[i - 2 - 1] != 'v') || (basename.A[i - 1 - 1] != 'i'))) {
basename.A[i - 1] = '.';
basename.A[i + 1 - 1] = 'd';
basename.A[i + 2 - 1] = 'v';
basename.A[i + 3 - 1] = 'i';
basename.A[i + 4 - 1] = ' ';
}
curname = basename;
if (testaccess(4, 0)) {
opendvifile();
if (eofdvifile) {
(void)fprintf(stderr, "Input file not found\n"), Putl(output, 1);
goto L30;
}
} else {
(void)fprintf(stderr, "Cannot open input file\n"), Putl(output, 1);
goto L30;
}
if (logerrors) {
curname = basename;
i = 1;
while ((i <= namelength) && (curname.A[i - 1] != ' '))
i = i + 1;
curname.A[i - 3 - 1] = 'e';
curname.A[i - 2 - 1] = 'r';
curname.A[i - 1 - 1] = 'r';
if (testaccess(2, 0))
Rewritex(errfile, curname.A);
else {
(void)fprintf(stderr, "Cannot create error file\n"), Putl(output, 1);
goto L30;
}
} else {
(void)strncpy(curname.A, "/dev/null", sizeof(curname.A));
if (testaccess(2, 0))
Rewritex(errfile, curname.A);
else {
(void)fprintf(stderr, "Somebody stole /dev/null!\n"), Putl(output, 1);
goto L30;
}
}
p = getbyte();
if (p != 247) {
(void)fprintf(stderr, " Bad DVI file: First byte isn't start of preamble!!\n"), Putl(output, 1);
jumpout();
}
p = getbyte();
if (p != 2)
(void)fprintf(errfile.fp, "identification in byte 1 should be %1d!\n", 2), Putl(errfile, 1);
numerator = signedquad();
denominator = signedquad();
if (numerator <= 0) {
(void)fprintf(stderr, " Bad DVI file: numerator is %1d!\n", numerator), Putl(output, 1);
jumpout();
}
if (denominator <= 0) {
(void)fprintf(stderr, " Bad DVI file: denominator is %1d!\n", denominator), Putl(output, 1);
jumpout();
}
horizconv = (numerator / ((real)254000.0)) * (horizresolution / ((real)denominator));
vertconv = (numerator / ((real)254000.0)) * (vertresolution / ((real)denominator));
mag = signedquad();
if (newmag > 0)
mag = newmag;
else
if (mag <= 0) {
(void)fprintf(stderr, " Bad DVI file: magnification is %1d!\n", mag), Putl(output, 1);
jumpout();
}
truehorizconv = horizconv;
horizconv = truehorizconv * (mag / ((real)1000.0));
truevertconv = vertconv;
vertconv = truevertconv * (mag / ((real)1000.0));
p = getbyte();
Putchr('\'', errfile);
while (p > 0) {
p = p - 1;
Putchr(xchr.A[getbyte()], errfile);
}
Putchr('\'', errfile),Putchr('\n', errfile);
n = dvilength();
if (n < 53) {
(void)fprintf(stderr, " Bad DVI file: only %1d bytes long!\n", n), Putl(output, 1);
jumpout();
}
m = n - 4;
do {
if (m == 0) {
(void)fprintf(stderr, " Bad DVI file: all 223s!\n"), Putl(output, 1);
jumpout();
}
movetobyte(m);
k = getbyte();
m = m - 1;
} while (!(k != 223));
if (k != 2) {
(void)fprintf(stderr, " Bad DVI file: ID byte is %1d!\n", k), Putl(output, 1);
jumpout();
}
movetobyte(m - 3);
q = signedquad();
if ((q < 0) || (q > m - 33)) {
(void)fprintf(stderr, " Bad DVI file: post pointer %1d at byte %1d!\n", q, m - 3), Putl(output, 1);
jumpout();
}
movetobyte(q);
k = getbyte();
if (k != 248) {
(void)fprintf(stderr, " Bad DVI file: byte %1d is not post!\n", q), Putl(output, 1);
jumpout();
}
postloc = q;
firstbackpointer = signedquad();
inpostamble = true;
readpostamble();
inpostamble = false;
q = postloc;
p = firstbackpointer;
startloc = -1;
if (p >= 0)
do {
if (p > q - 46) {
(void)fprintf(stderr, " Bad DVI file: page link %1d after byte %1d!\n", p, q), Putl(output, 1);
jumpout();
}
q = p;
movetobyte(q);
k = getbyte();
if (k == 139)
pagecount = pagecount + 1;
else {
(void)fprintf(stderr, " Bad DVI file: byte %1d is not bop!\n", q), Putl(output, 1);
jumpout();
}
{
integer B41 = 0,
B42 = 9;
if (B41 <= B42)
for (k = B41; ; k++) {
count.A[k] = signedquad();
if (k == B42) break;
}
}
if (startmatch())
startloc = q;
p = signedquad();
} while (!(p < 0));
if (startloc < 0) {
(void)fprintf(stderr, " starting page number could not be found!\n"), Putl(output, 1);
jumpout();
}
movetobyte(startloc + 1);
oldbackpointer = startloc;
{
integer B43 = 0,
B44 = 9;
if (B43 <= B44)
for (k = B43; ; k++) {
count.A[k] = signedquad();
if (k == B44) break;
}
}
p = signedquad();
started = true;
if (!inpostamble) {
while (maxpages > 0) {
maxpages = maxpages - 1;
(void)fprintf(errfile.fp, "Page "), Putl(errfile, 0);
{
integer B45 = 0,
B46 = startvals;
if (B45 <= B46)
for (k = B45; ; k++) {
(void)fprintf(errfile.fp, "%1d", count.A[k]), Putl(errfile, 0);
if (k < startvals)
Putchr('.', errfile);
else
Putchr(' ', errfile),Putchr('\n', errfile);
if (k == B46) break;
}
}
if (!dopage()) {
(void)fprintf(stderr, " Bad DVI file: page ended unexpectedly!\n"), Putl(output, 1);
jumpout();
}
do {
k = getbyte();
if ((k >= 243) && (k < 247)) {
p = firstpar(k);
definefont(p);
k = 138;
}
} while (!(k != 138));
if (k == 248) {
inpostamble = true;
goto L30;
}
if (k != 139) {
(void)fprintf(stderr, " Bad DVI file: byte %1d is not bop!\n", curloc - 1), Putl(output, 1);
jumpout();
}
newbackpointer = curloc - 1;
pagecount = pagecount + 1;
{
integer B47 = 0,
B48 = 9;
if (B47 <= B48)
for (k = B47; ; k++) {
count.A[k] = signedquad();
if (k == B48) break;
}
}
if (signedquad() != oldbackpointer)
(void)fprintf(errfile.fp, "backpointer in byte %1d should be %1d!\n", curloc - 4, oldbackpointer), Putl(errfile, 1);
oldbackpointer = newbackpointer;
}
L30:
;
}
L9999:
;
exit(0);
}
/*
** End of program code
*/
static FILE *
Fopen(n, m)
char *n, *m;
{
FILE *f;
register char *s;
static char ch = 'A';
static char tmp[MAXFILENAME];
extern int unlink();
if (n == NULL)
sprintf(tmp, "/tmp/ptc%d%c", getpid(), ch++);
else {
strncpy(tmp, n, sizeof(tmp));
for (s = &tmp[sizeof(tmp)-1]; *s == ' ' || *s == '\0'; )
*s-- = '\0';
if (tmp[sizeof(tmp)-1]) {
(void)fprintf(stderr, "Too long filename '%s'\n", n);
exit(1);
}
}
s = tmp;
if ((f = fopen(s, m)) == NULL) {
(void)fprintf(stderr, "Cannot open: %s\n", s);
exit(1);
}
if (n == NULL)
unlink(tmp);
return (f);
}
#if !defined(AIX) && !defined(__osf__)
extern int rewind();
#endif
static void
Caseerror(n)
int n;
{
(void)fprintf(stderr, "Missing case limb: line %d\n", n);
exit(1);
}
static int
Trunc(f)
real f;
{
return f;
}
static int
Round(f)
real f;
{
extern double floor();
return floor((double)(0.5+f));
}